// 为了方便管理请求接口，所有的请求都以异步 action 的方式进行封装
import http from '@/utils/http'
import { removeLocalHistories, setLocalHistories } from '@/utils/storage'
import store, { AppDispatch } from '..'
import { SearchAction } from '../reducer/search'

/**
 * 获取联想建议（自动补全）
 * @param q 搜索关键字
 * @returns Promise<void>
 */
export const getSuggestion = (q: string) => {
  return async (dispatch: AppDispatch) => {
    const res = await http.get(`/v1_0/suggestion?q=${q}`)
    console.log(`/v1_0/suggestion`, res)
    dispatch({ type: 'search/saveSuggestion', payload: res.data.options })
  }
}

/**
 * 清空搜索建议
 * @returns
 */
export const clearSuggestion = (): SearchAction => {
  return { type: 'search/clearSuggestion' }
}

/**
 * 添加历史记录
 * @param keyword 历史记录
 * @returns
 */
export const addHistory = (keyword: string) => {
  return async (dispatch: AppDispatch) => {
    // 获取原本的历史记录
    const { histories } = store.getState().search
    // 前添加历史记录，并进行数组去重
    const newHistories = Array.from(new Set([keyword, ...histories]))
    // 数量限制最多为 10 条
    if (newHistories.length > 10) newHistories.length = 10
    // 保存到 redux 中
    dispatch({ type: 'search/saveHistory', payload: newHistories })
    // 保存到 localStorage
    setLocalHistories(newHistories)
  }
}

/**
 * 清理搜索历史记录
 * @returns SearchAction
 */
export const clearHistory = () => {
  return async (dispatch: AppDispatch) => {
    // 清空本地存储的历史记录
    removeLocalHistories()
    // 清空 redux 中的历史记录
    dispatch({ type: 'search/clearHistory' })
  }
}

type SearchQuery = {
  page?: number
  per_page?: number
  q: string
}
/**
 * 获取搜索结果
 * @returns SearchAction
 */
export const getSearchResult = ({ page = 1, per_page = 10, q = '' }: SearchQuery) => {
  return async (dispatch: AppDispatch) => {
    // 根据关键词 和 分页信息 获取搜索列表
    const res = await http.get(`/v1_0/search`, { params: { page, per_page, q } })
    console.log(`/v1_0/search`, res)
    // 获取原本的搜索列表
    const { results } = store.getState().search
    // 分页需要把新旧搜索列表合并在一起
    dispatch({ type: 'search/saveResult', payload: [...results, ...res.data.results] })
    // 分页停止条件：    返回的列表长度 < 页容量
    if (res.data.results.length < per_page) {
      // console.log('分页结束，需要停下来')
      // 方案1：返回一个表示错误的Promise，catch 会捕获到错误Promise
      return Promise.reject('没有更多分页数据了~')
      // 方案2：制造一个错误对象，catch 会捕获到错误对象
      // throw new Error('没有更多分页数据了~')
    }
  }
}

/**
 * 清空搜索结果
 * @returns SearchAction
 */
export const clearSearchResult = () => {
  return async (dispatch: AppDispatch) => {
    dispatch({ type: 'search/clearResult' })
  }
}
